
/*
 * En este archivo, implementaremos las funciones definidas
 * en el archivo listaworkers.h
 */

#include <stddef.h>
#include <malloc.h>
#include "listaworkers.h"

/*
 * Implementación de funcion definida en el header
 */
struct LISTA_WORKERS *inicializarListaDeWorkers(int cantidadWorkers) {

    // Reservamos la memoria necesaria para almacenar la lista
    struct LISTA_WORKERS *listaWorkers = malloc(sizeof(struct LISTA_WORKERS));
    listaWorkers->cantidad = 0;
    listaWorkers->capacidadMaxima = cantidadWorkers;
    listaWorkers->workers = malloc(sizeof(struct WORKER *) * cantidadWorkers);

    // Inicializamos el vector interno de workers
    int i;
    for (i=0; i<listaWorkers->capacidadMaxima; i++) {
        listaWorkers->workers[i] = NO_WORKER;
    }
    
    return listaWorkers;
}


/*
 * Implementación de funcion definida en el header
 */
struct WORKER *quitarWorkerDeLista(struct LISTA_WORKERS *listaWorkers, int idWorker) {

    // Obtenemos el worker en cuestion
    struct WORKER *worker = listaWorkers->workers[idWorker-1];

    // Decrementamos la cantidad de workers en al lista y borramos la referencia al worker quitado
    listaWorkers->cantidad--;
    listaWorkers->workers[idWorker-1] = NO_WORKER;
    
    return worker;
}


/*
 * Implementación de funcion definida en el header
 */
void colocarWorkerEnLista(struct LISTA_WORKERS *listaWorkers, struct WORKER *worker) {

    int posicionWorker = worker->idWorker - 1; // Usamos el id del worker como posicionador

    // Incrementamos la cantidad de workers y agregamos la referencia al mismo en el array interno
    listaWorkers->workers[posicionWorker] = worker;
    listaWorkers->cantidad++;
    
}


/*
 * Implementación de funcion definida en el header
 */
void eliminarListaDeWorkers(struct LISTA_WORKERS *listaWorkers, int eliminarElementos) {

    // Si nos exigen que eliminamos los elemenots, los eliminamos
    if (eliminarElementos) {
        int i;
        for (i = 0; i < listaWorkers->capacidadMaxima; i++) {
            free(listaWorkers->workers[i]);
        }
    }

    // Eliminamos los componentes internos y la lista propiamente dicha
    free(listaWorkers->workers);
    free(listaWorkers);

}

